Micron Document
Fox's Git Mirrors

Node / RFnexus / code.git / commits / 5721da8

Commit 5721da8bf7733fa1596b032b6adc752e5dc93dac


Parents : cd320b4
Author : Ahmet Inan <inan@aicodix.de>
Date : 2024-02-13T13:27:55+01:00

added vshuf versions for SSE

Changes

3 files changed, 72 insertions(+), 0 deletions(-)


Diff

diff --git a/sse4_1_double.hh b/sse4_1_double.hh
index 4daa09d..41dc193 100644
--- a/sse4_1_double.hh
+++ b/sse4_1_double.hh
@@ -1272,3 +1272,25 @@ inline SIMD<int32_t, 8> vclamp(SIMD<int32_t, 8> x, int32_t a, int32_t b)
return tmp;
}
+template <>
+inline SIMD<uint8_t, 32> vshuf(SIMD<uint8_t, 32> a, SIMD<uint8_t, 32> b)
+{
+ SIMD<uint8_t, 32> tmp;
+ for (int i = 0; i < 2; ++i)
+ tmp.m[i] = _mm_or_si128(
+ _mm_shuffle_epi8(a.m[0], _mm_or_si128(b.m[i], _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(15)))),
+ _mm_shuffle_epi8(a.m[1], _mm_sub_epi8(b.m[i], _mm_set1_epi8(16))));
+ return tmp;
+}
+
+template <>
+inline SIMD<int8_t, 32> vshuf(SIMD<int8_t, 32> a, SIMD<uint8_t, 32> b)
+{
+ SIMD<int8_t, 32> tmp;
+ for (int i = 0; i < 2; ++i)
+ tmp.m[i] = _mm_or_si128(
+ _mm_shuffle_epi8(a.m[0], _mm_or_si128(b.m[i], _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(15)))),
+ _mm_shuffle_epi8(a.m[1], _mm_sub_epi8(b.m[i], _mm_set1_epi8(16))));
+ return tmp;
+}
+

diff --git a/sse4_1_quadruple.hh b/sse4_1_quadruple.hh
index 71d8fa9..3b4db08 100644
--- a/sse4_1_quadruple.hh
+++ b/sse4_1_quadruple.hh
@@ -1272,3 +1272,29 @@ inline SIMD<int32_t, 16> vclamp(SIMD<int32_t, 16> x, int32_t a, int32_t b)
return tmp;
}
+template <>
+inline SIMD<uint8_t, 64> vshuf(SIMD<uint8_t, 64> a, SIMD<uint8_t, 64> b)
+{
+ SIMD<uint8_t, 64> tmp;
+ for (int i = 0; i < 4; ++i)
+ tmp.m[i] = _mm_or_si128(_mm_or_si128(_mm_or_si128(
+ _mm_shuffle_epi8(a.m[0], _mm_or_si128(b.m[i], _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(15)))),
+ _mm_shuffle_epi8(a.m[1], _mm_or_si128(_mm_sub_epi8(b.m[i], _mm_set1_epi8(16)), _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(31))))),
+ _mm_shuffle_epi8(a.m[2], _mm_or_si128(_mm_sub_epi8(b.m[i], _mm_set1_epi8(32)), _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(47))))),
+ _mm_shuffle_epi8(a.m[3], _mm_sub_epi8(b.m[i], _mm_set1_epi8(48))));
+ return tmp;
+}
+
+template <>
+inline SIMD<int8_t, 64> vshuf(SIMD<int8_t, 64> a, SIMD<uint8_t, 64> b)
+{
+ SIMD<int8_t, 64> tmp;
+ for (int i = 0; i < 4; ++i)
+ tmp.m[i] = _mm_or_si128(_mm_or_si128(_mm_or_si128(
+ _mm_shuffle_epi8(a.m[0], _mm_or_si128(b.m[i], _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(15)))),
+ _mm_shuffle_epi8(a.m[1], _mm_or_si128(_mm_sub_epi8(b.m[i], _mm_set1_epi8(16)), _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(31))))),
+ _mm_shuffle_epi8(a.m[2], _mm_or_si128(_mm_sub_epi8(b.m[i], _mm_set1_epi8(32)), _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(47))))),
+ _mm_shuffle_epi8(a.m[3], _mm_sub_epi8(b.m[i], _mm_set1_epi8(48))));
+ return tmp;
+}
+

diff --git a/sse4_1_triple.hh b/sse4_1_triple.hh
index 5b5818d..162d16c 100644
--- a/sse4_1_triple.hh
+++ b/sse4_1_triple.hh
@@ -1272,3 +1272,27 @@ inline SIMD<int32_t, 12> vclamp(SIMD<int32_t, 12> x, int32_t a, int32_t b)
return tmp;
}
+template <>
+inline SIMD<uint8_t, 48> vshuf(SIMD<uint8_t, 48> a, SIMD<uint8_t, 48> b)
+{
+ SIMD<uint8_t, 48> tmp;
+ for (int i = 0; i < 3; ++i)
+ tmp.m[i] = _mm_or_si128(_mm_or_si128(
+ _mm_shuffle_epi8(a.m[0], _mm_or_si128(b.m[i], _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(15)))),
+ _mm_shuffle_epi8(a.m[1], _mm_or_si128(_mm_sub_epi8(b.m[i], _mm_set1_epi8(16)), _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(31))))),
+ _mm_shuffle_epi8(a.m[2], _mm_sub_epi8(b.m[i], _mm_set1_epi8(32))));
+ return tmp;
+}
+
+template <>
+inline SIMD<int8_t, 48> vshuf(SIMD<int8_t, 48> a, SIMD<uint8_t, 48> b)
+{
+ SIMD<int8_t, 48> tmp;
+ for (int i = 0; i < 3; ++i)
+ tmp.m[i] = _mm_or_si128(_mm_or_si128(
+ _mm_shuffle_epi8(a.m[0], _mm_or_si128(b.m[i], _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(15)))),
+ _mm_shuffle_epi8(a.m[1], _mm_or_si128(_mm_sub_epi8(b.m[i], _mm_set1_epi8(16)), _mm_cmpgt_epi8(b.m[i], _mm_set1_epi8(31))))),
+ _mm_shuffle_epi8(a.m[2], _mm_sub_epi8(b.m[i], _mm_set1_epi8(32))));
+ return tmp;
+}
+

Served by rngit 1.4.1 - Generated in 0.05s